﻿//DbCfgFun.h

#ifndef DBCFGFUN_H
#define DBCFGFUN_H

#pragma once

#include "SqLiteDB.h"
#include "TABLEDEFINE.h"
#include "tabledef_to_len.h"


class DbCfgFun
{
public:
	DbCfgFun(void);
	~DbCfgFun(void);

//////////////////////////////////////////////////////////////////////////
//表名表相关

public:
/*	函数：	GetTableInfobyAppType
	用途：	获取表名表记录根据AppType
	输入：  int AppType, char *&Buff, int *buff_len
	返回：  */
	int	GetTableInfobyAppType(int AppType, char *&Buff, int *buff_len);

/*	函数：	GetTableInfobyAppType_TableId
	用途：	获取表名表记录根据AppType和表ID
	输入：  int AppType, char *&Buff, int *buff_len
	返回：  */
	int	GetTableInfobyAppType_TableId(int AppType, int TableId, char *&Buff, int *buff_len);
	int	GetTableInfobyAppType_TableId(int AppType, int TableId, cTable_Info *pTableInfo);

/*	函数：	GetTableEngNamebyAppType_TableId
	用途：	获取表的英文名，根据AppType和TableId
	输入：  int AppType, int TableId, char *&Buff, int *buff_len
	返回：  */
	int	GetTableEngNamebyAppType_TableId(int AppType, int TableId, char *&Buff, int *buff_len);
	int	GetTableEngNamebyAppType_TableId(int AppType, int TableId, char *TableName);

/*	函数：	GetTableChnNamebyAppType_TableId
	用途：	获取表的中文名，根据AppType和TableId
	输入：  int AppType, int TableId, char *&Buff, int *buff_len
	返回：  */
	int	GetTableChnNamebyAppType_TableId(int AppType, int TableId, char *&Buff, int *buff_len);
	int	GetTableChnNamebyAppType_TableId(int AppType, int TableId, QString &TableChnName);

/*	函数：	GetAppType_TableIdbyTableEngName
	用途：	获取AppType和TableId，根据表的英文名
	输入：  int AppType, int TableId, char *&Buff, int *buff_len
	返回：  */
	int	GetAppType_TableIdbyTableEngName(int &AppType, int &TableId, char *Buff, int Buff_len);
	int	GetAppType_TableIdbyTableEngName(int &AppType, int &TableId, QString TableChnName);


//////////////////////////////////////////////////////////////////////////
//域名表相关

public:
/*	函数：	GetColumnInfobyAppType_TableId
	用途：	获取表的所有域信息AppType和TableId
	输入：  int AppType, int TableId, char *&pColumnBuff, int *ColumnNum
	返回：  */
	int	GetColumnInfobyAppType_TableId(int AppType, int TableId, char *&pColumnBuff, int *ColumnNum);
	int	GetPtlColumnInfobyAppType_PtlParamType(int AppType, int PtlParamType, char *&pColumnBuff, int *ColumnNum);
	
/*	函数：	GetCurColumnDataOffset
	用途：	获取表的当前域的内存偏移
	输入：  cColumn_Info *pColumnInfo, int ColumnNum, int *&pColBuffOffset
	返回：  */
	int	GetCurColumnDataOffset(cColumn_Info *pColumnInfo, int ColumnNum, int coluNo, int &BuffOffset);

/*	函数：	GetColBuffOffSetbyColumnInfo
	用途：	获取表的所有域的内存偏移
	输入：  cColumn_Info *pColumnInfo, int ColumnNum, int *&pColBuffOffset
	返回：  */
	int	GetColBuffOffSetbyColumnInfo(cColumn_Info *pColumnInfo, int ColumnNum, int *&pColBuffOffset);

/*	函数：	GetCurTableColumnInfo
	用途：	获取当前表的域名和内存偏移信息
	输入：  int AppType, int TableId, char *&pColumnInfo, int *&pDataOffset, int &ColumnNum, int &RecordLen
	返回：  */	
	int	GetCurTableColumnInfo(int AppType, int TableId, char *&pColumnInfo, int *&pDataOffset, int &ColumnNum, int &RecordLen, int PtlParamType=0);

/*	函数：	GetColEngNamebyAppType_TableId_ColId
	用途：	获取域的英文名通过AppType、TableId和COLId
	输入：  int AppType, int TableId, char *&pColumnBuff, int *ColumnNum
	返回：  */
	int	GetColEngNamebyAppType_TableId_ColId(int AppType, int TableId, int ColumnId, char *&pColEngName, int *buff_len);

/*	函数：	GetColChnNamebyAppType_TableId_ColId
	用途：	获取域的中文名通过AppType、TableId和COLId
	输入：  int AppType, int TableId, char *&pColumnBuff, int *ColumnNum
	返回：  */
	int	GetColChnNamebyAppType_TableId_ColId(int AppType, int TableId, int ColumnId, char *&pColChnName, int *buff_len);
	int	GetColChnNamebyAppType_TableId_ColId(int AppType, int TableId, int ColumnId, QString &ColNameText);

/*	函数：	GetColLenbyAppType_TableId_ColEnName
	用途：	获取域的数据长度通过AppType、TableId和ColName
	输入：  int AppType, int TableId, char *&pColumnBuff, int *ColumnNum
	返回：  */
	int	GetColLenbyAppType_TableId_ColEnName(int AppType, int TableId, char *pColEnName, int &ColbuffLen);

/*	函数：	GetTableEngNameAndColName
	用途：	获取表的英文名及字段英文名
	输入：  int AppType, int TableId, unsigned int ColumnId, char *TableName, char *ColName
	返回：  */
	int	GetTableEngNameAndColName(int AppType, int TableId, unsigned int ColumnId, char *TableName, char *ColName);

//////////////////////////////////////////////////////////////////////////
//表相关	
	
	//	删除表
	int		DropTable(char TableName[], int bufflen, int AppType, int TableId);

	//	创建数据表
	int		CreateNewTable(int AppType, int TableId);
	
	//检查表是否存在
	int		CheckTableIsExist(char TableName[], int bufflen);

/*	函数：	GetCreateTableSQL
	用途：	获取创建表的SQL语句
	输入：  int AppType, int TableID, char *sql
	返回：  */
	int		GetCreateTableSQL(int AppType, int TableID, char *sql);
	int		GetCreateTableSQL(int AppType, int TableID, char *sql, char *TableName);


	//	创建数据表
	int		CreateNewDevTable(SqLiteDB *pSqlDB, int AppType, int TableId, bool bDropOldTableFlag);
	//检查表是否存在
	int		CheckDevTableIsExist(SqLiteDB *pSqlDB,char TableName[], int bufflen);

	//	删除表
	int		DropDevTable(SqLiteDB *pSqlDB,char TableName[]);
	
	int		GetMaxFreeId_DeviceDB(SqLiteDB *pSqlDB,unsigned int AppType, unsigned int TableId, unsigned int &RecordId);

	//	获取当前表的空闲ID（unsigned int类型，加1顺序递增）
	int		GetNewFreeId_DeviceDB(SqLiteDB *pSqlDB,int AppType, int TableId, unsigned int &RecordId);

//////////////////////////////////////////////////////////////////////////
//取记录内容、名称、条数

public:
/*	函数：	GetRecordBuffbyAppType_TableId
	用途：	获取表记录根据AppType和TableId
	输入：  int AppType, int TableId, char *&Buff, int *buff_len
	返回：  */
	int	GetRecordBuffbyTableName(char pTablName[], char *&Buff, int *buff_len);

/*	函数：	GetRecordBuffbyAppType_TableId
	用途：	获取表记录根据AppType和TableId
	输入：  int AppType, int TableId, char *&Buff, int *buff_len
	返回：  */
	int	GetRecordBuffbyAppType_TableId(int AppType, int TableId, char *&Buff, int *buff_len, bool bOrderBy);
	int	GetRecordBuffbyAppType_TableId(int AppType, int TableId, char *&Buff, int *buff_len, int *RecordLength, bool bOrderBy);
	int GetRecordBuffbyAppType_TableId_TotalShow(int AppType, int TableId, char *&Buff, int *buff_len, int *RecordLength, bool bOrderBy,int FUN);
	
/*	函数：	GetRecordBuffbyTableName_ParentId
	用途：	获取表记录根据表名和parentId
	输入：  int AppType, int TableId, char *&Buff, int *buff_len
	返回：  */
	int	GetRecordBuffbyTableName_ParentId(char pTablName[],int parentId, char *&Buff, int *buff_len);

/*	函数：	GetRecordBuffbyAppType_TableId
	用途：	获取表记录根据AppType、TableId、parentId
	输入：  int AppType, int TableId, char *&Buff, int *buff_len
	返回：  */
	int	GetRecordBuffbyAppType_TableId_ParentId(int AppType, int TableId, int parentId, char *&Buff, int *buff_len, bool bOrderBy);
	int	GetRecordBuffbyAppType_TableId_ParentId(int AppType, int TableId, int parentId, char *&Buff, int *buff_len, int *RecordLength, bool bOrderBy);

	int	GetRecordBuffbyAppType_TableId_TaskId(int AppType, int TableId, int ParentTaskId, char *&Buff, int *buff_len,int *RecordLength);

	int	GetRecordBuffbyAppType_TableId_sec(int AppType, int TableId, int secId, char *&Buff, int *buff_len, int *RecordLength, bool bOrderBy);

/*	函数：	GetRecordBuffbyAppType_TableId
	用途：	获取表记录根据AppType、TableId和记录ID
	输入：  int AppType, int TableId, char *&Buff, int *buff_len
	返回：  */
	int	GetRecordBuffbyAppType_TableId_RecordId(int AppType, int TableId, int RecordId, char *&Buff, int *buff_len);

/*	函数：	GetRecordBuffbyAppType_TableId
	用途：	获取表记录根据AppType、TableId、parentId
	输入：  int AppType, int TableId, char *&Buff, int *buff_len
	返回：  */
	int	GetRecordNamebyAppType_TableId_RecordId(int AppType, int TableId, int RecordId, char *&buff, int *buff_len);
	int	GetRecordNamebyAppType_TableId_RecordId(int AppType, int TableId, int RecordId, QString &RecordName);

/*	函数：	GetRecordNumbyAppType_TableId
	用途：	获取表记录条数根据AppType和TableId
	输入：  int AppType, int TableId, int *RecordNum
	返回：  */
	int	GetRecordNumbyAppType_TableId(int AppType, int TableId, int *RecordNum);
	int	GetRecordNumbyAppType_TableId(char *TableEnName, int BuffLen, int &RecordNum);

/*	函数：	GetRecordNumbyAppType_TableId_ParentId
	用途：	获取表记录条数根据AppType、TableId和ParentId
	输入：  int AppType, int TableId, int *RecordNum
	返回：  */
	int	GetRecordNumbyAppType_TableId_ParentId(int AppType, int TableId, unsigned int ParentId, int *RecordNum);

/*	函数：	GetParentIdbyAppType_TableId_RecordId
	用途：	获取记录的ParentId根据AppType、TableId和RecordId
	输入：  int AppType, int TableId, int *RecordNum
	返回：  */
	int	GetParentIdbyAppType_TableId_RecordId(int AppType, int TableId, int RecordId, unsigned int &ParentId);
//////////////////////////////////////////////////////////////////////////
//记录ID

/*	函数：	GetMaxFreeId
	用途：	获取当前表的最大空闲ID（unsigned int类型，加1顺序递增）
	输入：  int AppType, int RecordId, unsigned int &RecordId
	返回：  */
	int	GetMaxFreeId(unsigned int AppType, unsigned int TableId, unsigned int &RecordId);
	
/*	函数：	GetNewFreeId
	用途：	获取当前表的空闲ID（unsigned int类型，加1顺序递增）
	输入：  int AppType, int RecordId, unsigned int &RecordId
	返回：  */
	int	GetNewFreeId(int AppType, int TableId, unsigned int &RecordId,unsigned int TypeValue=0);
//////////////////////////////////////////////////////////////////////////
//通道相关
/*	函数：	CurRecordIsHasChild
	用途：	当前记录是否有子记录
	输入：	int CurTableId, unsigned int RecordId, int ChildTableId
	返回：	*/	
	bool	CurRecordIsHasChild(int CurAppType,int CurTableId, unsigned int RecordId, int ChildTableId);
//////////////////////////////////////////////////////////////////////////
//设备相关

/*	函数：	IsCurDevAddrRepeatInRout
	用途：	判断当前设备地址在通道中是否重复
	输入：	int DevAddr, unsigned char DevType, unsigned int ParentId
	返回：	*/
	bool	IsCurDevAddrRepeatInRout(int DevAddr, unsigned char DevType, unsigned int ParentId);
//////////////////////////////////////////////////////////////////////////
//

/*	函数：	SetDefaultData
	用途：	设置记录默认值
	输入：  int AppType, int RecordId, unsigned int &RecordId
	返回：  */
	int	SetDefaultData(char *pRecordBuff, cColumn_Info *pColumnInfo, int *pDataOffset, int ColumnNum, int RecordLen, unsigned int ParentId);

/*	函数：	SetDefaultData_Special
	用途：	设置特殊默认值
	输入：  int AppType, int TableId, char *pRecordBuff, unsigned short IndexNo
	返回：  */
	int	SetDefaultData_Special(int AppType, int TableId, char *pRecordBuff, unsigned short IndexNo, char *pDevName = NULL);

/*	函数：	GetInsertValueSQL
	用途：	组织SQL Insert语句的values()部分语句
	输入：	char ValueBuf[], char Recorbuff[], cColumn_Info *pColumnInfo, int *pMemPos, int ColumNum
	返回：	*/		
	int	GetInsertValueSQL(char ValueBuf[], char Recorbuff[], int Buff_len, cColumn_Info *pColumnInfo, int *pMemPos, int ColumNum, int Type);

/*	函数：	GetUpdateColValueSQL
	用途：	组织SQL update语句的set部分语句
	输入：	char ValueBuf[], char Recorbuff[], cColumn_Info *pColumnInfo, int *pMemPos, int ColumNum
	返回：	*/		
	int	GetUpdateColValueSQL(char FieldDatabuff[], int Buff_len, cColumn_Info *pColumnInfo, QString &SetSQL);

/*	函数：	GetOrderBySQL_AppTypeTableId
	用途：	组织SQL select语句的order by部分语句
	输入：	unsigned int AppType, unsigned int TableId, QString &OrderSQL
	返回：	*/
	int	GetOrderBySQL_AppTypeTableId(unsigned int AppType, unsigned int TableId, QString &OrderSQL);

/*	函数：	InsertRecordIntoDB
	用途：	组织SQL Insert语句并插入记录
	输入：	int AppType, int TableId, char *pDataBuff, int Buff_len, cColumn_Info *pColumnInfo, int *pMemPos, int ColumnNum
	返回：	*/	
	int	InsertRecordIntoDB(int AppType, int TableId, char *pDataBuff, int Buff_len, cColumn_Info *pColumnInfo, int *pMemPos, int ColumnNum);
	int	InsertRecordIntoDB(int AppType, int TableId, char *pDataBuff, int Buff_len, cColumn_Info *pColumnInfo, int *pMemPos, int ColumnNum, char *pTableName);

/*	函数：	InsertRecordIntoDB
	用途：	组织SQL delete语句并删除记录
	输入：	int AppType, int TableId, int RecordId, char *pTableName
	返回：	*/	
	int	DeleteAllRecord(int AppType, int TableId);
	int	DeleteAllRecord(int AppType, int TableId, char *pTableName);

/*	函数：	InsertRecordIntoDB
	用途：	组织SQL delete语句并删除记录
	输入：	int AppType, int TableId, int RecordId, char *pTableName
	返回：	*/	
	int	DeleteRecordByID(int AppType, int TableId, unsigned int RecordId);
	int	DeleteRecordByID(int AppType, int TableId, unsigned int RecordId, char *pTableName);

/*	函数：	DeleteRecordByParentId
	用途：	组织SQL delete语句并删除记录
	输入：	int AppType, int TableId, int RecordId, char *pTableName
	返回：	*/	
	int	DeleteRecordByParentId(int AppType, int TableId, unsigned int ParentId);
	int	DeleteRecordByParentId(int AppType, int TableId, unsigned int ParentId, char *pTableName);

/*	函数：	UpDateOneColumnData
	用途：	组织SQL update语句并修改记录字段
	输入：	int AppType, int TableId, int RecordId, char *pTableName
	返回：	*/	
	int	UpDateOneColumnData(cColumn_Info *pColInfo, unsigned int RecordId,  char *pDataBuff, int Bufflen, char *pTableName);
	int	UpDateOneColumnData(cColumn_Info *pColInfo, unsigned int RecordId, char *pDataBuff, int Bufflen);
	int	UpDateOneColumnData(int AppType, int TableId, QString sTableName, QString sClmEngName, unsigned int Data_uint, unsigned int RecordId);

/*	函数：	ClearColumnData
	用途：	清空记录字段值为0
	输入：	int AppType, int TableId, int RecordId, char *pTableName
	返回：	*/	
	int	ClearColumnData(int AppType, int TableId, QString sTableName, QString sClmEngName, unsigned int ColumnData);

/*	函数：	DeleteRecordbyColData
	用途：	删除记录通过字段值
	输入：	int AppType, int TableId, int RecordId, char *pTableName
	返回：	*/	
	int	DeleteRecordbyColData(int AppType, int TableId, QString sTableName, QString sClmEngName, unsigned int ColumnData);

/*	函数：	CheckDataIsSaft
	用途：	检查记录是否安全
	输入：	int AppType, int TableId, char *pRecordBuff
	返回：	*/
	bool	CheckDataIsSaft(int AppType, int TableId, char *pRecordBuff, int OperType);

/*	函数：	UpdataRecordNamebyID
	用途：	修改记录名通过ID
	输入：	
	返回：	*/	
	int		UpdataRecordNamebyID(int AppType, int TableId, unsigned int RecordId, char *pTableName, char *RecordName);


	int		GetInsertHeadSql(int AppType, int TableId,char *pTableName, QString &SqlStr);

	int		GetValuesSql(/*char ValueBuf[],*/ char Recorbuff[], int Buff_len, cColumn_Info *pColumnInfo, int *pMemPos, int ColumNum, int Type, QString &SqlStr);

//////////////////////////////////////////////////////////////////////////
//关联字段相关

/*	函数：	ClearYx_RelateYkOrRelateSubYk
	用途：	清空遥信记录中的的配置主遥控或副遥控
	输入：	unsigned int RecordId, unsigned int RltRecordId, bool bConfigMaste
	返回：	*/	
	int	ClearYx_RelateYkOrRelateSubYk(unsigned int YxRecordId, unsigned int RelateYkId);

/*	函数：	CurYKIsUsedInYx
	用途：	当前遥控是否使用在遥信中（主遥控、副遥控 不重复） 
	输入：  int NodeId
	返回：  */
	bool	CurYKIsUsedInYx(unsigned int YkId);

/*	函数：	CurRecordIsUsedInColRelate
	用途：	当前记录是否已关联使用在某表的某个字段
	输入：  int AppType, int RecordId, int RecordTableId, int CheckTableId, int CheckColId
	返回：  */
	bool	CurRecordIsUsedInColRelate(int AppType, unsigned int RecordId, int RecordTableId, int CheckTableId, int CheckColId);
	bool	CurRecordIsUsedInColRelate(unsigned int RecordId, unsigned int RltTableId, char *pTableName, char *pColName);

/*	函数：	GetParentIdForSIYAO
	用途：	获取四遥的设备ID(带偏移)
	输入：  int NodeId
	返回：  */
	int		GetParentIdForSIYAO(int TableId, unsigned int RecordId, unsigned int &ParentId);

/*	函数：	GetSIYAONameFromParentIdAndIndexNo
	用途：	获取四遥的名称
	输入：  
	返回：  */
	int		GetSIYAONameFromParentIdAndIndexNo(int TableId, unsigned int ParentId, unsigned short IndexNo, QString &NameStr);

	/*	函数：	CurYxIsUsedInDevRepair
	用途：	当前遥信是否使用在设备置检修上
	输入：  XINT NodeId
	返回：  */
	bool	 CurYxIsUsedInDevRepair(unsigned int YxId);

	/*	函数：	ConfigConegerAndMasState
	用途：	配置通道的主备关联和主从状态
	输入：	XUINT RecordId, XUINT RltRecordId, XBOOL8 bConfigMaste
	返回：	*/	
	int	ConfigConegerAndMasState(int AppType, int TableId, int RecordId, int RltRecordId, bool bConfigMaste);

	/*	函数：	ConfigYkTransmitAndYx
	用途：	配置遥控转发表关联闭锁遥信信息
	输入：	XUINT RecordId, XUINT RltRecordId, XBOOL8 bConfigMaste
	返回：	*/	
	int ConfigYkTransmitAndYx(int RecordId,unsigned int TaskIdYxLock, unsigned int DevIdYxLock, unsigned int IndexNoYxLock);

	/*	函数：	CurTaskIsSub
	用途：	当前节点是否是从节点
	输入：  XINT NodeId
	返回：  */
	bool	CurTaskIsSub(int TaskId);

	/*	函数：	CurSubTaskIsRelated
	用途：	当前Sub通道是否已经关联过主从通道
	输入：  XINT NodeId
	返回：  */
	bool	CurSubTaskIsRelated(int TaskId);

	//调整四遥点中设备的名称
	void	AdjustDevNameForSiYao(char *PreName, char *AfterName, int DeviceId);

	int   GetMenuInfoByMenuName(char *MenuName, char *&buff);

	int	  GetTaskIdAndDevIdAndIndexNoByIndexId(int m_RelateId,unsigned int IndexId,unsigned int &TaskId,unsigned int &DevId,unsigned int &IndexNo);
	
	//将Str的内容填充到BUFF
	int	InputStrToBuff(char *buff, QString Str, int BuffLen);

	//检查IP地址的正确性
	bool CheckIpIsSafe(char IP[], int Length);

	//	获取当前表的空闲点号（unsigned int类型，加1顺序递增）
	int	GetNewFreeIndexNo(int AppType, int TableId,unsigned int ParentId, unsigned short &IndexNo);

	//	获取当前表的最大空闲点号（unsigned int类型，加1顺序递增）
	int	GetMaxFreeIndexNo(unsigned int AppType, unsigned int TableId,unsigned int ParentId,unsigned short &IndexNo);

	/* 函数：			GetItemType
	用途：			通过任务类型和通道用途获取ItemType
	输入：			
	返回：			*/
	int	GetPtlParamType(unsigned char RoutType,unsigned char Protocol);

	int	AddTaskParaRecord(unsigned int TaskId, unsigned char RoutType,unsigned char Protocol);
};	

#endif
